package com.uco.oop.extend;

// 多态强调对象的多态和方法的多态（必须出现继承关系和方法的重写）
// 方法多态：编译看左边，运行看右边
// 属性多态：编译看左边，运行看左边（属性不谈多态）
public class Polymorphism {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.eat();
        Animal cat = new Cat();
        cat.eat();
        System.out.println(cat.name);

        // 可以通过强制类型转换，将父类的引用指向子类的对象，就可以调用子类都有的方法
        // 运行时，如果对象的真实类型和强制转换的类型不一样，会报 ClassCastException
        // Dog dog1 = (Dog) cat; 编译时不报错，因为 cat 的类型是 Animal
        // 可以通过 instanceof 判断，如果 instanceof 后面的类型不是 cat 的父类，会报错
        if(cat instanceof Cat) {
            Cat cat1 = (Cat) cat;
            cat1.clamTree();
        }
    }
}

class Animal {

    public String name = "animal";

    public void eat() {
        System.out.println("animal eat");
    }

    public void clamTree() {
        System.out.println("cat clam tree");
    }
}

class Dog extends Animal {
    private String name;
    @Override
    public void eat() {
        super.name = "dog";
        System.out.println("dog eat");
    }
}

class Cat extends Animal {
    public String name = "cat";
    @Override
    public void eat() {
        System.out.println("cat eat");
    }
}
